package com.yaodian100.ec.shopping.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.yaodian100.core.common.exception.CoreException;
import com.yaodian100.core.common.service.DomainService;
import com.yaodian100.ec.product.entity.Product;
import com.yaodian100.ec.product.entity.Specification;
import com.yaodian100.ec.product.entity.SpecificationInventory;
import com.yaodian100.ec.shopping.entity.CartOrderProductDetail;
import com.yaodian100.ec.shopping.entity.CartOrders;

public interface CartOrdersService extends DomainService<CartOrders> {

	/**
	 * 在已知購物車的狀況, 放入其他商品 若未登入情境, 結帳前應該呼叫 mergeCart 將此購物車與主購物車合併
	 * 
	 * @param memberId 未登入前, 可為 null
	 * @param cartId
	 * @param productId
	 * @param specId
	 * @param qty
	 * @param categoryPath
	 * @param addOnProductId
	 * @return
	 * @throws CoreException
	 */
	public CartOrders addProduct(String memberId, String cartId, String productId, List<String> productOption,
			Long specId, int qty, String categoryPath, List<String> addOnProductId) throws CoreException;

	/**
	 * 此method只允許TuangouShopAction呼叫，因为团购加入商品的条件不分上下架，不参与任何行销活动
	 */
	public CartOrders addProductForTuangou(String memberId, CartOrders cartEntity, String productId, Long specId,
			int qty, String categoryPath) throws CoreException;

	/**
	 * 此method只允許TuangouShopAction呼叫，因为团购加入商品的条件不分上下架，不参与任何行销活动
	 */
	public CartOrders createCartForTuangou(String memberId, String productId, List<String> productOption, Long specId,
			int qty, String categoryPath, List<String> addOnProductId) throws CoreException;

	public CartOrders addProductForStep1(String memberId, String cartId, String productId, List<String> productOption,
			Long specId, int qty, String categoryPath, List<String> addOnProductId) throws CoreException;

	/**
	 * 
	 * 
	 * @param cart
	 * @param promoteId
	 * @param type '5' 滿額購, '2' 贈品
	 * @return
	 * @throws CoreException
	 */
	public CartOrders addPromoteProduct(CartOrders cart, String promoteId, String type) throws CoreException;

	/**
	 * @param cart
	 * @param promoteId
	 * @param type '5' 滿額購, '2' 贈品
	 * @param specId 规格id
	 * @return
	 * @throws CoreException
	 */
	public CartOrders addPromoteProduct(CartOrders cart, String promoteId, String type, String specId)
			throws CoreException;

	/**
	 * @param cart
	 * @param promoteId
	 * @param type '5' 滿額購, '2' 贈品
	 * @param prodId 商品id
	 * @param specId 规格id
	 * @return
	 * @throws CoreException
	 */
	public CartOrders addPromoteProduct(CartOrders cart, String promoteId, String type, String prodId, String specId)
			throws CoreException;

	/**
	 * 計算購物車的活動滿足條件, 將活動相關資訊放入 cart.cartOrderProducts.applyCampaign
	 * 
	 * @param cart
	 * @param optional 'cookie': 請傳 UserData.applySource, default 為 yaodian100 'domain': 請傳 hostname, default 為
	 *          ServerValue.frontHostname().substring(7)
	 * @return
	 * @throws CoreException
	 */
	public CartOrders calculateCart(CartOrders cart, Map<String, String> optional) throws CoreException;

	/**
	 * 計算購物車的活動滿足條件, 將活動相關資訊放入 cart.cartOrderProducts.applyCampaign
	 * 
	 * @param cart
	 * @param optional 'cookie': 請傳 UserData.applySource, default 為 yaodian100 'domain': 請傳 hostname, default 為
	 *          ServerValue.frontHostname().substring(7)
	 * @param campaigns 計算邏輯採用固定 campaign, 但此 campaign 必須為有效(endDate 容許過期 10min)
	 * @return
	 * @throws CoreException
	 */
	public CartOrders calculateCart(CartOrders cart, Map<String, String> optional, List<String> campaigns)
			throws CoreException;

	/*
	 * Step1-確認數量 一般商品 (含主商品、预购、加购、满额购等)
	 */
	public String checkSpecInventory(String cartId, String addCmpPd, Map<String, String> optional, String checkFlag)
			throws Exception;

	/*
	 * Step1-確認數量 赠品
	 */
	public String checkSpecInventoryForPresent(String cartId, Map<String, String> optional) throws Exception;

	/*
	 * Step2-確認數量 一般商品 (含主商品、预购、加购、满额购等)
	 */
	public String checkSpecInventoryTwo(String cartId, String addCmpPd) throws Exception;

	/*
	 * Step2-確認數量 赠品
	 */
	public String checkSpecInventoryTwoForPresent(String cartId, Map<String, String> optional) throws Exception;

	public void cleanCartOrder30Days(String cartId) throws Exception;

	public void cleanCartOrderNow(String cartId) throws Exception;

	/**
	 * 建立新的購物車, 若 memberId 為 null, 建立臨時購物車, 若 memberId 不為 null, 檢核主購物車是否存在, 存在建立新的臨時購車 for 立即購買,電話訂購. 否則建立主購物車
	 * 
	 * @param memberId optional
	 * @param productId require, 商品属性仅可为 一般(0), 預購(1), N選M(6)
	 * @param specId optional, 所選商品之 specId, 若為 null, 系統自動取得第一個
	 * @param productOption optional, N选M 等额外参数格式應為 prodId;specId 或 prodId , 若 specId 未知, 系統預設商品第一組 specId
	 * @param qty require, 商品購買量, 若低於庫存, 自動等於庫存. N選M 強制為 1
	 * @param categoryPath optional, 挑選商品之目錄. 若為 null, 自動等於商品主目錄
	 * @param addOnProductId 加购商品属性, 赠品不可放入
	 * @return
	 * @throws CoreException errors.product.null : 商品{productId}不存在 errors.specification.null : 商品{productId}规格{specId}不存在
	 *           errors.shelf.null : 商品{productId}上架档不存在 errors.cart.product.type : 商品{productId}属性{type}不可加入购物车
	 *           errors.cart.product.type.nm : N選M商品{productId}加入失敗,商品數量不符
	 */
	public CartOrders createCart(String memberId, String productId, List<String> productOption, Long specId, int qty,
			String categoryPath, List<String> addOnProductId) throws CoreException;

	public CartOrders createCartForStep1(String memberId, String productId, List<String> productOption, Long specId,
			int qty, String categoryPath, List<String> addOnProductId) throws CoreException;

	/**
	 * memberId 為 null, cartId 不為 null, 情境為 未登入 memberId 有, cartId 為 null, 同等與 memberId=cartId(登入後取得主購物車) memberId 有,
	 * cartId 也有, 且不相等, 情境為 直接購買, 電話訂購 單獨建立購物車
	 * 
	 * @param memberId action keep
	 * @param cartId
	 * @return
	 * @throws CoreException
	 */
	public CartOrders getCart(String memberId, String cartId) throws CoreException;

	/**
	 * 登入後需要將臨時購物車併入主購物車
	 * 
	 * @param cartFrom 臨時購物車 memberId 應為 null
	 * @param cartTo 主購物車, cartId 應相等於 memberId
	 * @return cartTo entity
	 * @throws CoreException
	 */
	public CartOrders mergeCart(String cartFrom, String cartTo) throws CoreException;

	/**
	 * show 购物车重量明细
	 * 
	 * @param criteria
	 * @return
	 * @throws Exception
	 */
	public Map<String, String> showProductWeight(List<CartOrderProductDetail> cartOrderProductDetails) throws Exception;

	public int checkSpecInvReturnQty(Product product, Specification spec, SpecificationInventory specInv, int qty)
			throws Exception;

	public CartOrders forceUpdateCart(CartOrders entity) throws CoreException;

	/**
	 * 依購物車商品判斷是否需要輸入驗證碼
	 * 
	 * @return
	 * @throws CoreException
	 */
	public boolean needValidateNum(String cartId) throws CoreException;

	/**
	 * 检核验证码是否正确
	 * 
	 * @param imageId
	 * @param inputCode
	 * @return
	 */
	public void checkCode(String imageId, String inputCode) throws CoreException;

	/**
	 * 檢查購物車內的 商品有哪些是大材積
	 * 
	 * @param cartId
	 * @return 商品編號,商品名稱
	 * @throws CoreException
	 */
	public Map<String, String> chkVolumeOfCartOrderDetail(String cartId) throws CoreException;

	/**
	 * 取得團購的購物車
	 * 
	 * @param oid
	 * @return
	 * @throws CoreException
	 */
	public CartOrders getTuangouCart(Serializable oid) throws CoreException;

	/*
	 * 確認團購的商品庫存
	 */
	public String checkTuangouSpecInventory(String cartId) throws Exception;
}